package com.klm.easymq.core.adapter.config;

import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.util.HashMap;
import java.util.Map;

/**
 * MQ配置基类
 * 定义通用的配置属性，支持不同MQ的特定配置
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MQConfig {
    
    /**
     * MQ类型
     */
    private String type;
    
    /**
     * 连接地址
     */
    private String address;
    
    /**
     * 连接超时时间（毫秒）
     */
    @Builder.Default
    private Integer connectionTimeout = 30000;
    
    /**
     * 请求超时时间（毫秒）
     */
    @Builder.Default
    private Integer requestTimeout = 3000;
    
    /**
     * 重试次数
     */
    @Builder.Default
    private Integer retryTimes = 2;
    
    /**
     * 是否启用SSL
     */
    @Builder.Default
    private Boolean sslEnabled = false;
    
    /**
     * 用户名
     */
    private String username;
    
    /**
     * 密码
     */
    private String password;
    
    /**
     * 虚拟主机（RabbitMQ）
     */
    private String virtualHost;
    
    /**
     * 生产者配置
     */
    @Builder.Default
    private ProducerConfig producer = new ProducerConfig();
    
    /**
     * 消费者配置
     */
    @Builder.Default
    private ConsumerConfig consumer = new ConsumerConfig();
    
    /**
     * 扩展配置
     */
    @Builder.Default
    private Map<String, Object> extensions = new HashMap<>();
    
    /**
     * 添加扩展配置
     * @param key 配置键
     * @param value 配置值
     * @return 当前配置对象
     */
    public MQConfig addExtension(String key, Object value) {
        this.extensions.put(key, value);
        return this;
    }
    
    /**
     * 获取扩展配置
     * @param key 配置键
     * @return 配置值
     */
    public Object getExtension(String key) {
        return this.extensions.get(key);
    }
    
    /**
     * 获取扩展配置，如果不存在返回默认值
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    @SuppressWarnings("unchecked")
    public <T> T getExtension(String key, T defaultValue) {
        Object value = this.extensions.get(key);
        return value != null ? (T) value : defaultValue;
    }
    
    /**
     * 生产者配置
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ProducerConfig {
        
        /**
         * 生产者组
         */
        private String group;
        
        /**
         * 发送超时时间（毫秒）
         */
        @Builder.Default
        private Integer sendTimeout = 3000;
        
        /**
         * 发送失败重试次数
         */
        @Builder.Default
        private Integer retryTimesWhenSendFailed = 2;
        
        /**
         * 异步发送失败重试次数
         */
        @Builder.Default
        private Integer retryTimesWhenSendAsyncFailed = 2;
        
        /**
         * 消息压缩阈值（字节）
         */
        @Builder.Default
        private Integer compressMessageBodyThreshold = 4096;
        
        /**
         * 最大消息大小（字节）
         */
        @Builder.Default
        private Integer maxMessageSize = 4194304;
    }
} 